package org.yi.fc.ext.tag;

import java.util.Collection;

import org.beetl.core.GeneralVarTagBinding;
import org.yi.fc.utils.NumberUtils;

/**
 * 遍历标签
 * @author ilgqh
 *
 */
public class ForEachTag  extends GeneralVarTagBinding{

	@Override
	public void render() {
		Object items = this.getAttributeValue("data");
		
		if(items == null) return;
		
		if(items instanceof Collection){
			collectionForEach( (Collection) items);
		}else if(items instanceof String){
			String itmesStr = (String) items;
			if( NumberUtils.isNumber(itmesStr) ){
				NumForEach( NumberUtils.toInt(itmesStr) );
			}else{
				throw new NumberFormatException("无法将【" + itmesStr + "】转换为int类型数字");
			}
		}else if(items instanceof Integer){
			Integer i = (Integer) items;
			NumForEach(i);
		}else if(items.getClass().isArray()){  //迭代数组
			Object [] arrays = (Object[]) items; 
			ArrayForEach(arrays);
		}else if(items.getClass().isEnum()){  //迭代枚举
			Object [] enmuValues = items.getClass().getEnumConstants();  //获取枚举内元素的值值
			ArrayForEach(enmuValues);
		}else{
			throw new UnknownError("无法将标签中的数据转换为Collection和数字类型");
		}
		
	}
	
	/**
	 * 迭代集合
	 * @param items  集合（list，set等）
	 */
	private void collectionForEach(Collection items){
		if(items == null || items.size() == 0){
			return;
		}
		int i=0;
		for(Object o : items){
			this.binds(o,i++);
			this.doBodyRender(); 
		}
	}
	
	/**
	 * 根据传入的int值，作for循环
	 * @param limit 循环几次（int类型）
	 */
	private void NumForEach(Integer limit){
		if(limit == null){
			return;
		}
		for(int i = 0; i < limit; i++){
			this.binds(i);
			this.doBodyRender(); 
		}
	}
	
	/**
	 * 迭代数组
	 * @param array
	 */
	private void ArrayForEach(Object [] array){
		if(array != null){
			int i=0;
			for(Object obj : array){
				this.binds(obj,i++);
				this.doBodyRender(); 
			}
		}else{
			return;
		}
	}
}
